package 反射;

import java.io.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class MyReflectDemo4 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, IOException {
        /**
         * Class类中用于获取成员方法的方法
         *
         * Method[l getMethods(): 返回所有公共成员方法对象的数组，包括继承的
         * Methodll getDeclaredMethods(): 返回所有成员方法对象的数组，不包括继承的
         * Method getMethod(String name, Class<?>... parameterTypes): 返回单个公共成员方法对象
         * Method getDeclaredMethod(String name,Class<?>... parameterTypes): 返回单个成员方法对象
         *
         * Method类中用于创建对象的方法
         * Object invoke(Object obj, Object... args): 运行方法
         * 参数一:用obj对象调用该方法
         * 参数二:调用方法的传递的参数(如果没有就不写)
         * 返回值:方法的返回值 (如果没有就不写)
         */
        //1.获取字节码文件
        Class aClass = Class.forName("反射.Message");
        //2.获取公共的成员方法(包括继承)
        Method[] methods = aClass.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println("================================================");
        Method[] declaredMethods = aClass.getDeclaredMethods();
        for (Method method : declaredMethods) {
            System.out.println(method);
        }
        System.out.println("================================================");
        //获取单个的成员方法
        Method sleep = aClass.getMethod("sleep");
        System.out.println(sleep);
        Method eat = aClass.getDeclaredMethod("eat", String.class);
        System.out.println(eat);

        System.out.println("================================================");
        Message message = new Message("城阳", 15);
        Message message1 = new Message("陈元", 15);
        saveObject(message);
    }

    //把对象里面所有的成员变量名和值保存到本地文件中
    public static void saveObject(Object obj) throws ClassNotFoundException, IllegalAccessException, IOException {
        //获取字节码对象
        Class<?> aClass = Class.forName("反射.Message");
        //获取所有的成员变量
        Field[] declaredFields = aClass.getDeclaredFields();
        //创建IO流用于写入文件中
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\idea2022\\day.com.qiezi\\day_15\\src\\反射\\a.txt"));
        for (Field field : declaredFields) {
            //临时取消访问权限
            field.setAccessible(true);
            //获取成员变量的名字
            String name = field.getName();
            //获取成员变量的值
            Object value = field.get(obj);
            //写入本地文件中
            bw.write(name + ":" + value);
            bw.newLine();
        }
        bw.close();
    }
}

class Message {
    private String name;
    private int age;

    public Message() {
    }

    public Message(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     *
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     *
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     *
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     *
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Message{name = " + name + ", age = " + age + "}";
    }

    public void sleep() {
        System.out.println("sleep_睡觉");
    }

    private void eat(String something) {
        System.out.println(" eat再吃" + something);
    }
}
